package api;

import com.fasterxml.jackson.databind.ObjectMapper;
import model.User;
import model.UserDao;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/* @Author      zouzh
 * @PackageName blog_system
 * @Package     api
 * @Date        2023/8/17 16:24
 */
@WebServlet("/login")
public class LoginServlet extends HttpServlet {

    private ObjectMapper objectMapper = new ObjectMapper();
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 设置请求的解码
        req.setCharacterEncoding("utf8");
        // 1. 从请求中，获取到用户名和密码
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        if (username == null || username.equals("") || password == null || password.equals("")){
            String html = "<h3>登录失败！用户名或密码错误</h3>";
            resp.setContentType("text/html; charset=utf8");
            resp.getWriter().write(html);
            return;
        }

        // 2. 读取数据库，看看这里的用户名密码，是否和数据库中的匹配
        UserDao userDao = new UserDao();

        User user = userDao.selectUserByName(username);
        // 用户不存在
        if (user == null){
            String html = "<h3>登录失败！用户名或密码错误</h3>";
            resp.setContentType("text/html; charset=utf8");
            resp.getWriter().write(html);
            return;
        }
        // 密码错误
        if (!password.equals(user.getPassword())){
            String html = "<h3>登录失败！用户名或密码错误</h3>" + user.getPassword() +" " + password;
            resp.setContentType("text/html; charset=utf8");
            resp.getWriter().write(html);
            return;
        }
        // 3. 用户名和密码都正确，登录成功 需要设置会话
        // 此处需要先创建一个会话
        HttpSession session = req.getSession(true);
        // 此处就把用户对象存储到 session 中了，下次用户访问其它页面，就可以直接拿到会话，进一步拿到之前的 user 对象了
        session.setAttribute("user",user);
        // 4. 返回一个重定向响应，能够跳转到博客列表页
        resp.sendRedirect("blog_list.html");
    }

    //通过这个方法，判定用户的登录状态，已登录，返回 200，未登录返回 403
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 看当前请求是否已经存在会话，并且当前的会话是否包含 user 对象
        HttpSession session = req.getSession(false);
        // 会话不存在，未登录状态
        if (session == null){
            resp.setStatus(403);
            return;
        }

        // 虽然会话对象存在，但是用户对象没有，为登录状态
        User user = (User) session.getAttribute("user");
        if (user == null){
            resp.setStatus(403);
            return;
        }
        // 已经登录了
        // 200 是默认的状态码，此处不写 200 也是可以的
        resp.setStatus(200);
        resp.setContentType("application/json;charset=utf8");
        user.setPassword(""); // 避免把密码返回给前端，降低密码泄露的风险
        String respJson = objectMapper.writeValueAsString(user);
        resp.getWriter().write(respJson);
    }
}
